/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tt.VorlesungenService;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import java.text.ParseException;
import java.util.Collection;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import net.fortuna.ical4j.model.Date;
import net.fortuna.ical4j.util.UidGenerator;
import tt.Exception.EntityServiceException;
import tt.Servlet.PDFServlet;
import tt.model.Courseschedule;
import tt.model.Lecturedate;
import tt.model.Lecture;
import tt.view.timetableBean;

/**
 *
 * @author Doscre
 */
public class PDF {
    
    Font fontBig = new Font(Font.FontFamily.HELVETICA, 9, Font.BOLD);
    Font fontBigRed = new Font(Font.FontFamily.HELVETICA, 9, Font.BOLD, BaseColor.BLACK.RED);
    Font fontNormal = new Font(Font.FontFamily.HELVETICA, 9, Font.NORMAL);
    private Courseschedule mySchedule;
    
    public PDF(Courseschedule mySchedule) {
        this.mySchedule = mySchedule;
    }//end method

    public PdfPTable createTable() throws ParseException {
        
        String[] Wochentage = {
            "Uhrzeit", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"
        };
        String[][] Uhrzeit = new String[7][2];
        Uhrzeit[0][0] = "08:15";
        Uhrzeit[0][1] = "09:45";
        Uhrzeit[1][0] = "10:00";
        Uhrzeit[1][1] = "11:30";
        Uhrzeit[2][0] = "11:45";
        Uhrzeit[2][1] = "13:15";
        Uhrzeit[3][0] = "13:30";
        Uhrzeit[3][1] = "15:00";
        Uhrzeit[4][0] = "15:15";
        Uhrzeit[4][1] = "16:45";
        Uhrzeit[5][0] = "17:00";
        Uhrzeit[5][1] = "18:30";
        Uhrzeit[6][0] = "18:45";
        Uhrzeit[6][1] = "20:15";
        
        
        
        Lecturedate currentLecturedate = null;
        //Hole Liste mit allen Lecturedates
        Lecturedate[] myLectureDates = (mySchedule.getLecturedateCollection()).toArray(new Lecturedate[0]);

        //[Zeile][Spalte]
        PdfPCell[][] cellarray = new PdfPCell[8][7];
        PdfPTable table = new PdfPTable(7);


        //######################## Array wird befüllt #######################################
        //*******Befülle Array -Erste Zeile enhält Tage
        for (int spalte = 0; spalte < Wochentage.length; spalte++) {
            cellarray[0][spalte] = makeCell(Wochentage[spalte], BaseColor.LIGHT_GRAY, 1);
        }//end for Spalte

        //*******Befülle Array -Erste Spalte enhält Uhrzeit
        for (int zeile = 1; zeile < Uhrzeit.length + 1; zeile++) {
            cellarray[zeile][0] = makeCell(Uhrzeit[zeile - 1][0] + " -\n" + Uhrzeit[zeile - 1][1], BaseColor.LIGHT_GRAY, 0);
        }//end for Spalte

        
        
        int pointerLectureDate = 0;


        //Schleife durchläuft Alle Zeilen ab Zeile 1

        for (int aktSpalte = 1; aktSpalte < Wochentage.length; aktSpalte++) {
            //Schleife durchläuft alle Spalten ab Spalte 1 (Vorlesungstermine pro Tag
            for (int aktZeile = 1; aktZeile <= Uhrzeit.length; aktZeile++) {
               //Suche passendes Lecturedate zur aktuellen Zelle
                String textCell = "";
                //Durchlaufe Collection mit Lecturedates, bis das passende Date gefunden wurde 
                //oder der Wochentag nicht mehr übereinstimmt oder das letzte Lecturedate erreicht wurde
                while (true) {
                    //wenn alle Termine geprüft wurden - stop die schleife
                    if (pointerLectureDate == myLectureDates.length) {
                        break;
                    }
                    currentLecturedate = myLectureDates[pointerLectureDate];
                    //Vergleiche ob aktueller Wochentag im Plan ==Wochentag im Lecturedate
                    if (currentLecturedate.getDay().compareToIgnoreCase(Wochentage[aktSpalte]) == 0) {

                        //Uhrzeit aus Lecturedate
                        int zeitLectureDate = Integer.parseInt((currentLecturedate.getStarttimeShort().substring(0, 2)));
                        //Uhrzeit aus Zeile
                        int zeitZeile = Integer.parseInt((Uhrzeit[aktZeile - 1][0].substring(0, 2)));

                        //Vergleiche Uhrzeit
                        //wenn Uhrzeit aus Lecturedate größer als die der Zeile, gibt es im aktuellen Slot keine Vorlesung
                        if (zeitLectureDate > zeitZeile) {
                            //aktueller Slot hat kein Element --> kommt später
                            //  Logger.getLogger(PDF.class.getName()).log(Level.INFO, "Kein Element bei Zeit: " + zeitZeile + " (" + zeitLectureDate + ")");
                            break;
                        } else if (zeitLectureDate == zeitZeile) {
                            //Vorlesung muss in aktuellen Slot
                            //Logger.getLogger(PDF.class.getName()).log(Level.INFO, zeitZeile + ": Slot für Lecture gefunden: " + currentLecturedate.getLecture().getLecname());
                            textCell = currentLecturedate.getRoom();
                            if (cellarray[aktZeile][aktSpalte]==null)
                            {
                                Paragraph head = new Paragraph(currentLecturedate.getLecture().getLecname(), fontBig);
                                cellarray[aktZeile][aktSpalte]=(makeCell(head, textCell, BaseColor.WHITE));
                            }   else
                            {
                                Paragraph head = new Paragraph(currentLecturedate.getLecture().getLecname(), fontBigRed);
                                cellarray[aktZeile][aktSpalte].addElement(head);
                                cellarray[aktZeile][aktSpalte].addElement(new Paragraph(textCell, fontNormal));
                            }//end if
                            pointerLectureDate++;
                            
                            //Schutz vor Überlauf
                            if (pointerLectureDate < myLectureDates.length) {
                                //wenn das nächste Lecturedate die gleiche Uhrzeit hat
                                if (myLectureDates[pointerLectureDate].getStarttime().compareTo(currentLecturedate.getStarttime()) == 0) {//wenn auch noch der Tag gleich ist
                                    Logger.getLogger(PDF.class.getName()).log(Level.INFO, "hier");
                                    if (myLectureDates[pointerLectureDate].getDay().compareTo(currentLecturedate.getDay()) == 0) {
                                        Logger.getLogger(PDF.class.getName()).log(Level.INFO, "Konflikt mit nächsten");
                                        aktZeile--;
                                    }//end if
                                }//end if
                            } //end if
                            break;
                        } else {
                           //kann bei diesem Vorgehen nicht eintreten!

                        }//end if
                    } else {
                        //Tag passt nicht - break
                        //Logger.getLogger(PDF.class.getName()).log(Level.INFO, "Break - Tag passt nicht: " + currentLecturedate.getDay() + ", " + Wochentage[aktSpalte]);
                        break;
                    }//end if
                }//end while
            }//end for Spalten
        }//end for Zeilen



        //#########################Array wird in table geschrieben######################################
        PdfPCell tempCell;
        for (int zeile = 0; zeile < Uhrzeit.length + 1; zeile++) {
            for (int spalte = 0; spalte < Wochentage.length; spalte++) {
                
                if (cellarray[zeile][spalte] != null) {
                    tempCell = cellarray[zeile][spalte];
                    table.addCell(tempCell);
                } else {
                    table.addCell(makeCell("", BaseColor.WHITE, 0));
                }
            }//end for spalte
        }// end for zeile

        //Spaltenbreiten werden angegeben
        try {
            table.setWidths(new int[]{1, 3, 3, 3, 3, 3, 3});
        } catch (Exception Ex) {
        }//end try

        //Breite der Tabelle in %
        table.setWidthPercentage(100);
        
        return table;
    }//end method

    public PdfPTable createTableExam() throws ParseException {
        EntityService service = new EntityService();
        Collection<Lecture> myLectures = service.getLectureCollectionbyCourseSchedule(mySchedule);
        
        PdfPTable table = new PdfPTable(6);

        //Überschrift
        table.addCell(makeCell("Datum", BaseColor.LIGHT_GRAY, 0));
        table.addCell(makeCell("Zeit", BaseColor.LIGHT_GRAY, 0));
        table.addCell(makeCell("Vorlesung", BaseColor.LIGHT_GRAY, 0));
        table.addCell(makeCell("Raum", BaseColor.LIGHT_GRAY, 0));
        table.addCell(makeCell("Prüfer", BaseColor.LIGHT_GRAY, 0));
        table.addCell(makeCell("Kommentar", BaseColor.LIGHT_GRAY, 0));
        
        java.util.Date lastDatum = new java.util.Date();
        java.util.Date tempDatum;
        
        Lecture tempLecture;
        for (Iterator<Lecture> it = myLectures.iterator(); it.hasNext();) {
            tempLecture = it.next();
            if (tempLecture.getExam() == null) {
                //Kein Examen verknüpft
                table.addCell(makeCell("noch kein Termin", BaseColor.WHITE, 0));
                table.addCell(makeCell("", BaseColor.WHITE, 0));
                table.addCell(makeCell(tempLecture.getLecname(), BaseColor.WHITE, 0));
                table.addCell(makeCell("", BaseColor.WHITE, 0));
                table.addCell(makeCell("", BaseColor.WHITE, 0));
                table.addCell(makeCell("", BaseColor.WHITE, 0));
            } else {
                //Examen verknüpft
                //Datum wird nur einmal angezeigt
                tempDatum = tempLecture.getExam().getExamdate();
                if (tempDatum.compareTo(lastDatum) == 0) {
                    //Leere Zeile
                    table.addCell(makeCell("", BaseColor.WHITE, 0));
                } else {
                    lastDatum = tempDatum;
                    table.addCell(makeCell(tempLecture.getExam().getExamdateShort(), BaseColor.WHITE, 0));
                }//end if

                
                table.addCell(makeCell(tempLecture.getExam().getStarttimeShort(), BaseColor.WHITE, 0));
                table.addCell(makeCell(tempLecture.getLecname(), BaseColor.WHITE, 0));
                table.addCell(makeCell(tempLecture.getExam().getExamroom(), BaseColor.WHITE, 0));

                //Prüfer werden aufgelistet
                PdfPCell cell = makeCell("", BaseColor.WHITE, 0);
                if (tempLecture.getExam().getFirstexaminer() != null) {
                    Paragraph FirstExaminer = new Paragraph(tempLecture.getExam().getFirstexaminer().getWholeName(), fontNormal);
                    cell.addElement(FirstExaminer);
                }//end if
                if (tempLecture.getExam().getSecondexaminer() != null) {
                    Paragraph SecondExaminer = new Paragraph(tempLecture.getExam().getSecondexaminer().getWholeName(), fontNormal);
                    cell.addElement(SecondExaminer);
                }//end if
                table.addCell(cell);
                
                
                table.addCell(makeCell(tempLecture.getExam().getInfoexam(), BaseColor.WHITE, 0));
            }//end if

        }//end for






        //Spaltenbreiten werden angegeben
        try {
            table.setWidths(new int[]{2, 1, 3, 1, 3, 3});
        } catch (Exception Ex) {
        }//end try

        //Breite der Tabelle in %
        table.setWidthPercentage(100);
        
        return table;
    }
    
    public PdfPCell makeCell(String text, BaseColor color, int alignment) {
        PdfPCell cell = new PdfPCell();
        Paragraph para = new Paragraph(text, fontNormal);
        para.setAlignment(alignment);
        cell.addElement(para);
        cell.setBackgroundColor(color);
        
        return cell;
    }//end function

    public PdfPCell makeCell(Paragraph head, String text, BaseColor color) {
        PdfPCell cell = new PdfPCell();
        cell.addElement(head);
        cell.addElement(new Paragraph(text, fontNormal));
        cell.setBackgroundColor(color);
        return cell;
    }//end function
}
